package com.example.netty;


import java.io.UnsupportedEncodingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jca.context.SpringContextResourceAdapter;
import org.springframework.stereotype.Service;

import com.example.mq.NettyExchangeUtil;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

@Service
public class MyCustomHandler extends ChannelInboundHandlerAdapter {
	
	private static final Logger log = LoggerFactory.getLogger(MyCustomHandler.class);
	
	/*
	 * channelAction
	 *
	 * channel 通道 action 活跃的
	 *
	 * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
	 *
	 */
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		log.info(ctx.channel().localAddress().toString() + " 通道已激活！");
	}

	/*
	 * channelInactive
	 *
	 * channel 通道 Inactive 不活跃的
	 *
	 * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
	 *
	 */
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		log.info(ctx.channel().localAddress().toString() + " 通道不活跃,客户端主动断开服务端的链接！");
		// 关闭流

	}

	/**
	 * 
	 * @author Taowd
	 * TODO  此处用来处理收到的数据中含有中文的时  出现乱码的问题
	 * 2017年8月31日 下午7:57:28
	 * @param buf
	 * @return
	 */
	private String getMessage(ByteBuf buf) {
		byte[] con = new byte[buf.readableBytes()];
		buf.readBytes(con);
		try {
			return new String(con, "gb2312");
		} catch (UnsupportedEncodingException e) {
			log.error("转换报文失败",e);
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 功能：读取服务器发送过来的信息
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		// 第一种：接收字符串时的处理
		ByteBuf buf = (ByteBuf) msg;
		String rev = getMessage(buf);
		log.info("接收报文数据: " + rev);
		
		//TODO 发布到MQ
		RabbitTemplate rabbitTemplate = SpringUtils.getBean(RabbitTemplate.class);
		rabbitTemplate.convertAndSend(NettyExchangeUtil.ECO_AIRPARAM_FANOUT, "" ,rev);

	}

	/**
	 * 功能：读取完毕客户端发送过来的数据之后的操作
	 */
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		log.info("服务端接收数据完毕..");
		//写一个空的buf，并刷新写出区域。完成后关闭sock channel连接。
		ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
		
	}

	/**
	 * 功能：服务端发生异常的操作
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		log.error("服务端异常,msg={}",cause.getMessage(),cause);
		ctx.close();
	}
	

}
